<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Menu</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>Menu</h1>

<p>创建, 删除, 修改和显示菜单和菜单项. 改变托盘图标和它的提示. 控制是否可以打开 <a href="../Scripts.htm#ahk2exe">已编译脚本</a> 的主窗口.</p>

<pre class="Syntax">Menu, MenuName, Cmd [, P3, P4, P5]</pre>
<h3>参数</h3>
<table class="info">
  <tr>
    <td width="15%">MenuName</td>
    <td width="85%"><p> 它可以为 TRAY 或任何自定义菜单的名称. 首次和 <em>Add</em> 一起使用自定义菜单的名称时会自动创建此菜单. 例如: Menu, MyMenu, Add, Item1</p>
      <p>创建后, 可以用 <em>Show</em> 命令显示自定义菜单. 通过 <em>Add</em> 命令, 它还可以作为一个子菜单附加到一个或更多的其他菜单上. </p></td>
  </tr>
  <tr>
    <td>Cmd, P3, P4, P5 </td>
    <td>这 4 个参数彼此依赖. 参见下面的列表了解允许的组合. </td>
  </tr>
</table>

<h2>添加或改变菜单项</h2>
<p><strong>Add [, MenuItemName, Label-or-Submenu, Pn]</strong>: 此命令有多种用途, 包括添加菜单项, 使用新的子菜单或标签更新菜单项或把普通菜单项转换成子菜单项 (或相反). 如果 <em>MenuItemName</em> 还不存在, 它将被添加到菜单. 否则, 将使用指定的 <em>Label-or-Submenu</em> 更新 <em>MenuItemName</em>.</p>
<p>要添加一个菜单分隔线, 忽略所有三个参数.</p>
<p>当用户选择菜单项时标签子程序作为一个新 <a href="../misc/Threads.htm">线程</a> 运行 (类似于 <a href="Gosub.htm">Gosub</a> 和 <a href="../Hotkeys.htm">热键子程序</a>). 如果省略 <em>Label-or-Submenu</em>, 那么将使用 <em>MenuItemName</em> 同时作为标签和菜单项名称.</p>
<p>要让 <em>MenuItemName</em> 变成子菜单 -- 在选择时打开一个新菜单的菜单项 -- 在 <em>Label-or-Submenu</em> 中指定一个冒号后面跟着一个现有自定义菜单的 <em>MenuName</em>. 例如:</p>
<pre>Menu, MySubmenu, add, Item1
Menu, tray, add, This Menu Item Is A Submenu, :MySubmenu</pre>
<p>最后一个参数可以包含字母 P 后面跟着菜单的 <a href="../misc/Threads.htm">线程优先级</a>, 例如 P1. 如果添加菜单项时省略此参数, 优先级将为 0, 这是标准的默认值. 如果在更新菜单项时省略, 菜单项的优先级将不会被改变. 要改变一个现有菜单项的优先级, 省略 <em>Label-or-Submenu</em> 参数. 使用一个十进制 (不是十六进制) 数表示优先级.</p>
<p><strong><a name="Delete"></a>Delete [, MenuItemName</strong>]: 从菜单中删除 <em>MenuItemName</em>. 标准菜单项例如 Exit (参见下面) 不能被单独删除. 如果删除了 <em>d</em><em>efault</em> 菜单项, 效果类似于使用了 <em>NoDefault</em> 选项. 如果省略了 <em>MenuItemName</em>, 整个 <em>MenuName</em> 菜单将被删除, 同时删除在其他菜单中名称为 <em>MenuName</em> 的任何子菜单项.</p>
<p><strong>DeleteAll</strong>: 从菜单中删除所有自定义菜单项, 如果没有包含 <em>标准</em> 菜单项 (参见下面) 时则使菜单留空. 与使用 <em>Delete</em> 命令 (参见上面) 完全删除菜单不同, 一个空菜单仍然存在, 因此其他任何包含此菜单项作为子菜单的菜单仍保留这些子菜单.</p>
<p><strong>Rename, MenuItemName [, NewName]</strong>: 改变 <em>MenuItemName</em> 为 <em>NewName </em> (如果 <em>NewName</em> 为空, <em>MenuItemName</em> 将转变成一条分隔线). <em>NewName</em> 不能和任何现有的自定义菜单项名称相同. 菜单项的当前目标标签或子菜单不会改变.</p>
<p><strong>Check, MenuItemName</strong>: 在 <em>MenuItemName</em> 前添加一个可见的复选标记 (如果还没有的话).</p>
<p><strong>Uncheck, MenuItemName</strong>: 从 <em>MenuItemName</em> 中移除复选标记 (如果有的话).</p>
<p><strong>ToggleCheck, MenuItemName</strong>: 如果没有则添加一个复选标记; 否则, 移除它.</p>
<p><strong>Enable, MenuItemName</strong>: 如果之前禁用了 (变灰) <em>MenuItemName</em>, 允许用户再次选择它.</p>
<p><strong>Disable, MenuItemName</strong>: 使 <em>MenuItemName </em> 变成灰色以表示用户无法选择它.</p>
<p><strong>ToggleEnable, MenuItemName</strong>: 如果之前启用了 <em>MenuItemName</em> 则禁用它; 否则启用它.</p>
<p><strong>Default [, MenuItemName]</strong>: 改变菜单的默认项为 <em>MenuItemName</em> 并加粗其字体 (当前在 TRAY 以外的菜单中设置默认项只是改变外观而已). 当用户双击托盘图标时, 会运行其默认菜单项. 如果没有默认项, 则双击没有效果. 如果省略了 <em>MenuItemName</em>, 效果等同于使用了下面的 <em>NoDefault</em>.</p>
<p><strong>NoDefault</strong>: 对于托盘菜单: 让菜单恢复其默认菜单项, 对于未编译脚本为 OPEN 而 <a href="../Scripts.htm#ahk2exe">已编译脚本</a> 则没有 (除非 <em>MainWindow</em> 选项有效). 如果因为之前使用了下面的 NoStandard 命令使得 OPEN 菜单项不存在, 那么将没有默认项, 因此双击托盘图标没有效果. 对于 TRAY 以外的其他菜单: 任何现有的默认项恢复为非加粗字体. </p>
<p><strong>Standard</strong>: 在菜单底部插入标准菜单项 (如果还不存在的话). 此命令可用于托盘菜单或任何其他菜单.</p>
<p><strong>NoStandard</strong>: 从托盘菜单移除所有标准 (非自定义) 的菜单项 (如果存在的话).</p>
<h2 id="MenuIcon">设置或移除一个菜单项的图标 <span class="ver">[AHK_L 17+]</span></h2>
<p><strong>Icon, MenuItemName, FileName [, IconNumber, IconWidth]</strong>: 设置 <em>MenuItemName</em> 的图标. <em>FileName</em> 可以为一个图标文件或 AutoHotkey 支持的格式的任何图像. 要使用文件中首个外的其他图标组, 在 <em>IconNumber</em> 中指定其编号 (如果省略, 默认值为 1). 此外, 可以使用负数作为 <a href="../AHKL_Features.htm#icons">资源标识符</a>. 在 <em>IconWidth</em> 中指定期望的图标宽度. 如果 <em>IconNumber</em> 表示的图标组包含多种大小的图标, 则使用最接近的匹配并将图标调整到特定的大小. 参见示例段中的用法示例.</p>
<p>目前在 Windows Vista 和更高版本系统中如果需要设置的图标保留透明度则必须指定 "真实的大小". 例如:</p>
<pre>Menu, MenuName, Icon, MenuItemName, Filename.png,, 0</pre>
<p><strong>NoIcon, MenuItemName</strong>: 移除 <em>MenuItemName</em> 的图标, 如果有的话.
<h2>改变托盘的图标或提示 <span class="ver">(<em>MenuName</em> 必须为 TRAY)</span></h2>
<p><strong><a name="Icon"></a>Icon [, FileName, IconNumber, 1]</strong>: 将脚本的图标改变为 <em>FileName</em> 中图标的某个. 支持下列的文件类型: ICO, CUR, ANI, EXE, DLL, CPL, SCR 以及其他包含图标资源的类型. 要使用文件中首个外的其他图标组, 在 <em>IconNumber</em> 中指定其编号 (如果省略, 默认值为 1). 例如, <strong>2</strong> 将加载第二个图标组中的默认图标. 此外, 在 AutoHotkey_L 中, 可以使用负数作为资源标识符. 在 <em>FileName</em> 中指定星号 (*) 来恢复脚本到其默认图标.</p>
<p>最后一个参数: 在最后一个参数中指定 1 来冻结图标, 而 0 则解冻它 (或留空来保持冻结/解冻状态不变). 当图标已经冻结时, <a href="Pause.htm">Pause</a> 和 <a href="Suspend.htm">Suspend</a> 命令不会改变它. 注意: 要冻结 <em>当前的</em> 图标, 请使用 1, 例如: <em>Menu, Tray, Icon,,, 1</em></p>
<p>改变托盘图标同时也改变由 <a href="InputBox.htm">InputBox</a>, <a href="Progress.htm">Progress</a> 和后续创建的 <a href="Gui.htm">GUI</a> 窗体显示的图标. <a href="../Scripts.htm#ahk2exe">已编译脚本</a> 即使在编译时指定一个自定义图标也会受到影响. 注意: 如果之前使用如 <a href="_NoTrayIcon.htm">#NoTrayIcon</a> 隐藏了托盘图标, 改变图标将不会让它显示; 要让它显示, 使用 <em>Menu, Tray, Icon</em> (不带参数).</p>
<p><a name="distort"></a>从 .ICO 外的其他类型文件中加载托盘图标时可能产生轻微的变形. 尤其是 16x16 的图标. 要避免这种情况, 把想要的托盘图标保存到 .ICO 文件中.</p>
<p>操作系统的 DLL 和 CPL 文件包含的一些图标可能会有用. 例如: <em>Menu, Tray, Icon, Shell32.dll, 174 <em>; 省略 DLL 文件的路径以便它也适用于 Windows 9x.</em></em></p>
<p>内置变量 <strong>A_IconNumber</strong> 和 <strong>A_IconFile</strong> 包含了当前图标的编号和名称 (带有完整路径) (如果为默认图标则两者都为空).</p>
<p><strong>Icon </strong>(不带参数): 如果还没有托盘图标则创建它. 如果在脚本中使用了 <a href="_NoTrayIcon.htm">#NoTrayIcon</a>, 则此命令将覆盖它.</p>
<p><strong>NoIcon</strong>: 如果存在托盘图标则移除它. 如果在脚本的最顶部使用此命令, 当脚本运行时托盘图标可能出现短暂的时间. 要避免这种情况, 使用 <a href="_NoTrayIcon.htm">#NoTrayIcon</a> 代替. 如果托盘图标当前是隐藏的那么内置变量 <strong>A_IconHidden</strong> 值为 1 否则为 0.</p>
<p><strong>Tip [, Text]</strong>: 改变托盘图标的提示 -- 这是在鼠标悬停在托盘图标上时显示的. 要创建多行提示, 在每行之间使用换行符 (`n), 例如 Line1`nLine2. 仅显示 <em>Text</em> 中的前 127 个字符. 如果省略了 <em>Text</em>, 则提示恢复为其默认文本. 内置变量 <strong>A_IconTip</strong> 包含了当前提示的文本 (如果文本是默认的则为空).</p>
<h2>杂项命令 </h2>
<p><strong><a name="Show"></a>Show [, X, Y]</strong>: 显示 <em>MenuName</em>, 允许用户使用方向键, 菜单快捷键 (下划线字母) 或鼠标选择菜单项. 可以显示包括托盘菜单在内的任何菜单, 但 <a href="Gui.htm">GUI</a> 菜单栏例外. 如果 X 和 Y 都省略, 则菜单显示在鼠标指针当前位置. 如果仅其中一个省略, 则用鼠标指针的位置代替省略的这个. X 和 Y 都相对于活动窗口. 预先指定 "<a href="CoordMode.htm">CoordMode</a>, Menu" 可以让它们相对于整个屏幕. </p>
<p><strong>Color, ColorValue [, Single]</strong>: 改变菜单的背景颜色为 <em>ColorValue</em>, 它是 16 种 HTML 基础颜色之一或是 6 位的 RGB 颜色值 (参见 <a href="Progress.htm#colors">颜色图表</a>). 将 <em>ColorValue</em> 留空 (或指定单词 Default) 来恢复菜单的默认颜色. 如果后一个参数不是单词 Single, 则任何附加到此菜单的子菜单都将改变颜色. 此命令在 Windows 95/NT 上无效.</p>
<p><strong>Click, ClickCount</strong>: 在 <em>ClickCount</em> 中指定 1 来允许单击激活托盘菜单的默认菜单项. 在 <em>ClickCount</em> 中指定 2 来恢复到默认行为 (双击). 例如: Menu, Tray, Click, 1 </p>
<p><strong><a name="MainWindow"></a>MainWindow</strong>: 此命令仅影响 <a href="../Scripts.htm#ahk2exe">已编译脚本</a>. 它允许通过托盘图标打开脚本主窗口, 否则这是不行的. 它同时也启用了主窗口的 View 菜单项例如 "Lines most recently executed", 这样就允许查看脚本的源代码和其他信息. <em>MenuName</em> 必须为 TRAY. </p>
<p><strong>NoMainWindow</strong> (默认): 此命令仅影响 <a href="../Scripts.htm#ahk2exe">已编译脚本</a>. 它恢复脚本的默认行为, 即阻止打开主窗口. 即使此选项有效, 脚本运行中遇到下列命令时仍然会显示主窗口: <a href="ListLines.htm">ListLines</a>, <a href="ListVars.htm">ListVars</a>, <a href="ListHotkeys.htm">ListHotkeys</a> 和 <a href="KeyHistory.htm">KeyHistory</a>. <em>MenuName</em> 必须为 TRAY.</p>
<p><strong>UseErrorLevel [, off]</strong>: 如果脚本中从未使用过此选项, 其默认为 OFF. 每当 Menu 命令遇到错误时, OFF 设置会显示一个对话框并终止 <a href="../misc/Threads.htm">当前线程</a>. 指定 <em>Menu, Tray, UseErrorLevel</em> 以阻止对话框的显示和线程的终止; 作为替代, 如果出现错误 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被设置为 1 否则为 0. 要让此选项转回 off, 在后一个参数中指定 OFF. 此设置是全局的, 这意味着它影响所有菜单, 而不仅 <em>MenuName</em>.</p>
<h2>备注</h2>
<p>要给 <em>一个</em> 菜单项名称中的某个字母加下划线, 那么在这个字母前加一个 &amp; 符号. 当菜单显示时, 通过按下键盘上相应的按键可以选择这样的菜单项. 要显示一个原义的 &amp; 符号, 指定两个连续的 &amp; 符号, 例如: Save &amp;&amp; Exit</p>
<p>菜单和菜单项的名称长度最多可达 260 个字符.</p>
<p>引用一个现有的菜单或菜单项时, 名称不区分大小写但必须包含 &amp; 符号. 例如: &amp;Open</p>
<p>使用 <em>Menu, tray, add</em> (即省略其他所有参数) 可以给菜单添加分隔线. 不过, 当前不能单独删除分隔线. 要变通解决此问题, 可以使用 <em>Menu, tray, DeleteAll </em> 然后重新添加自定义菜单项. </p>
<p>新的菜单项总是添加到菜单的底部. 对于托盘菜单: 要把您的菜单项放到标准菜单项的上面, (在添加完自定义菜单项后) 执行 <em>Menu, tray, NoStandard</em>, 接着执行 <em>Menu, tray, Standard</em>.</p>
<p>不能使用任何菜单子命令单独地操作标准菜单项, 例如 "Pause Script" 和 "Suspend Hotkeys".</p>
<p>如果一个菜单项已完全变成空的 -- 例如使用 <em>Menu, MyMenu, DeleteAll </em> -- 则它无法被显示. 如果托盘菜单变成空的, 右击和双击托盘菜单将没有效果 (此时通常使用 <a href="_NoTrayIcon.htm">#NoTrayIcon</a> 更好).</p>
<p>如果一个菜单项的子程序已经运行而用户再次选择相同的菜单项, 将创建一个新 <a href="../misc/Threads.htm">线程</a> 运行相同的子程序, 并中断之前的线程. 想要缓冲这样的事件到以后执行, 在子程序的首行使用 <a href="Critical.htm">Critical</a> (不过, 这样也将缓冲/延迟其他线程例如按下的热键).</p>
<p>每当通过菜单项运行子程序时, 它会使用设置例如 <a href="SendMode.htm">SendMode</a> 的默认值开始. 这些默认值可以在 <a href="../Scripts.htm#auto">自动执行段</a> 改变.</p>
<p>内置变量 <strong><a href="../Variables.htm#ThisMenuItem">A_ThisMenuItem</a></strong> 和 <strong><a href="../Variables.htm#ThisMenuItemPos">A_ThisMenuItemPos</a> </strong>分别包含了最近用户选择的自定义菜单项的名称和位置 (如果没有则为空). 同样地, <strong>A_ThisMenu</strong> 是选择的 <strong>A_ThisMenuItem</strong> 的菜单名称. 当创建的菜单内容不总是相同时这些变量很有用. 在这种情况下, 通常最好把所有这样的菜单项指向相同的标签并让此标签引用上面的变量来决定执行什么动作.</p>
<p>要让非热键, 非 <a href="Gui.htm">GUI</a> 脚本持续运行 -- 例如仅包含自定义菜单或菜单项的脚本 -- 使用 <a href="_Persistent.htm">#Persistent</a>.</p>
<h2>相关</h2>
<p><a href="Gui.htm">GUI</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Thread.htm">Thread</a>, <a href="Critical.htm">Critical</a>, <a href="_NoTrayIcon.htm">#NoTrayIcon</a>, <a href="Gosub.htm">Gosub</a>, <a href="Return.htm">Return</a>, <a href="SetTimer.htm">SetTimer</a>, <a href="_Persistent.htm">#Persistent</a></p>
<h2>示例</h2>
<pre class="NoIndent"><em>; 示例 #1: This is a working script that adds a new menu item to the bottom of the tray icon menu.</em>

#Persistent <em>; Keep the script running until the user exits it.</em>
Menu, tray, add <em>; Creates a separator line.</em>
Menu, tray, add, Item1, MenuHandler <em>; Creates a new menu item.</em>
return MenuHandler: MsgBox You selected %A_ThisMenuItem% from menu %A_ThisMenu%. return</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例 #2: This is a working script that creates a popup menu that is displayed when the user presses the Win-Z hotkey.</em>

<em>; Create the popup menu by adding some items to it.</em>
Menu, MyMenu, Add, Item1, MenuHandler Menu, MyMenu, Add, Item2, MenuHandler Menu, MyMenu, Add <em>; Add a separator line.</em>

<em>; Create another menu destined to become a submenu of the above menu.</em>
Menu, Submenu1, Add, Item1, MenuHandler Menu, Submenu1, Add, Item2, MenuHandler

<em>; Create a submenu in the first menu (a right-arrow indicator). When the user selects it, the second menu is displayed.</em>
Menu, MyMenu, Add, My Submenu, :Submenu1 Menu, MyMenu, Add <em>; Add a separator line below the submenu.</em>
Menu, MyMenu, Add, Item3, MenuHandler <em>; Add another menu item beneath the submenu.</em>
return <em>; End of script's auto-execute section.</em>

MenuHandler: MsgBox You selected %A_ThisMenuItem% from the menu %A_ThisMenu%. return #z::Menu, MyMenu, Show <em>; i.e. press the Win-Z hotkey to show the menu.</em></pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例 #3: This is a working script that demonstrates some of the various menu commands.</em>

#Persistent #SingleInstance menu, tray, add <em>; separator</em>
menu, tray, add, TestToggle&amp;Check menu, tray, add, TestToggleEnable menu, tray, add, TestDefault menu, tray, add, TestStandard menu, tray, add, TestDelete menu, tray, add, TestDeleteAll menu, tray, add, TestRename menu, tray, add, Test return

<em>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</em>

TestToggle&amp;Check: menu, tray, ToggleCheck, TestToggle&amp;Check menu, tray, Enable, TestToggleEnable <em>; Also enables the next test since it can't undo the disabling of itself.</em>
menu, tray, add, TestDelete <em>; Similar to above.</em>
return TestToggleEnable: menu, tray, ToggleEnable, TestToggleEnable return TestDefault: if default = TestDefault { menu, tray, NoDefault default = } else { menu, tray, Default, TestDefault default = TestDefault } return TestStandard: if standard &lt;&gt; n { menu, tray, NoStandard standard = n } else { menu, tray, Standard standard = y } return TestDelete: menu, tray, delete, TestDelete return TestDeleteAll: menu, tray, DeleteAll return TestRename: if NewName &lt;&gt; renamed { OldName = TestRename NewName = renamed } else { OldName = renamed NewName = TestRename } menu, tray, rename, %OldName%, %NewName% return Test: MsgBox, You selected "%A_ThisMenuItem%" in menu "%A_ThisMenu%". return</pre>
<pre class="NoIndent"><em>; 示例 #4: This is a working script that adds icons to its menu items.</em>
Menu, FileMenu, Add, Script Icon, MenuHandler Menu, FileMenu, Add, Suspend Icon, MenuHandler Menu, FileMenu, Add, Pause Icon, MenuHandler Menu, FileMenu, Icon, Script Icon, %A_AhkPath%, 2 <em>;Use the 2nd icon group from the file</em>
Menu, FileMenu, Icon, Suspend Icon, %A_AhkPath%, -206 <em>;Use icon with resource identifier 206</em>
Menu, FileMenu, Icon, Pause Icon, %A_AhkPath%, -207 <em>;Use icon with resource identifier 207</em>
Menu, MyMenuBar, Add, &File, :FileMenu Gui, Menu, MyMenuBar Gui, Add, Button, gExit, Exit This Example Gui, Show MenuHandler: Return Exit: ExitApp
</pre>
</body>
</html>
